package br.com.cicero.notasfiscais.mb;

import java.io.Serializable;
import java.util.List;

import javax.inject.Inject;

import org.primefaces.model.LazyDataModel;
import org.primefaces.model.chart.PieChartModel;

import br.com.cicero.notasfiscais.annotation.Auditavel;
import br.com.cicero.notasfiscais.annotation.EmailComercial;
import br.com.cicero.notasfiscais.dao.DAO;
import br.com.cicero.notasfiscais.datamodel.DataModelProdutos;
import br.com.cicero.notasfiscais.modelo.Produto;
import br.com.cicero.notasfiscais.stereotypes.ViewBean;
import br.com.cicero.notasfiscais.util.JSFUtil;

@ViewBean
public class ProdutoBean implements Serializable {
	
	private Produto produto = new Produto();
	private List<Produto> produtos;
	private PieChartModel pieModel;
	private Long produtoId;
	private LazyDataModel<Produto> dataModel;
		
	@Inject JSFUtil jsfUtil;
	
	@Inject @EmailComercial
	private String email;
	
	@Inject
	private DAO<Produto> dao;
				
	@Auditavel
	public void grava() {
		if (produto.getId() == null) {
			dao.adiciona(produto);
			jsfUtil.addMessage("produto.sucesso");
		} else {
			dao.atualiza(produto);
		}
		this.produto = new Produto();
		this.produtos = dao.listaTodos();
		System.out.println("Notifica " + email + ": novo Produto cadastrado.");
	}
	
	public void remove(Produto produto) {
		dao.remove(produto);
		this.produtos = dao.listaTodos();
	}
	
	public void relatorioQuantidadePorProduto() {
		for (QuantidadePorProduto quantidadePorProduto : dao.relatorioQuantidadePorProduto()) {
			pieModel.set(quantidadePorProduto.getProduto().getNome(), quantidadePorProduto.getQuantidade());
		}
	}
	
	public List<Produto> busca() {
		return dao.buscaPorNome(produto.getNome());
	}
	
	public void carregaProduto() {
		if (produtoId != null && produtoId != 0) {
			produto = dao.buscaPorId(produtoId);
		}
	}
	
	public Double getSomatorioPrecoProdutos() {
		double somatorio = 0;
		if (produtos != null) {
			for (Produto p : produtos) {
				somatorio += p.getPreco();
			}
		}
		return somatorio;
	}
	
	public List<Produto> busca(String nome) {
		return dao.buscaPorNome(nome);
	}
					
	public void cancelar() {
		this.produto = new Produto();
	}
	
	public List<Produto> getProdutos() {
		if (produtos == null) {
			produtos = dao.listaTodos();
		}
		return produtos;
	}
		
	public Produto getProduto() {
		return produto;
	}
	
	public void setProduto(Produto produto) {
		this.produto = produto;
	}
	
	public PieChartModel getPieModel() {
		pieModel = new PieChartModel();
		relatorioQuantidadePorProduto();
		return pieModel;
	}

	public Long getProdutoId() {
		return produtoId;
	}

	public void setProdutoId(Long produtoId) {
		this.produtoId = produtoId;
	}

	public LazyDataModel<Produto> getDataModel() {
		dataModel = new DataModelProdutos();
		dataModel.setRowCount(dao.contaTodos());
		dataModel.setPageSize(5);
		return dataModel;
	}

	public void setDataModel(LazyDataModel<Produto> dataModel) {
		this.dataModel = dataModel;
	}
	
	
	
	@Inject
	public void setDao(DAO<Produto> dao) {
		this.dao = dao;
	}
			
}
